package com.itany.corejava.code15_stream;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.UnaryOperator;
import java.util.stream.Stream;

/**
 * @author 石小俊
 * @date 2023年05月31日 9:48
 */
public class Test01_创建Stream对象 {

    public static void main(String[] args) {
        // 方式一:Collection体系的集合
        List<Integer> list = Arrays.asList(1, 3, 6, 8, 13, 15);
        Stream<Integer> stream = list.stream();
        System.out.println(stream);
        // 在Stream提供了一个终止foreach
        // foreach用于遍历Stream中的元素
        // 该方法的参数是一个Consumer函数式接口
        stream.forEach(System.out::println);
        System.out.println("--------------------------------");

        // 方式二:Map体系的集合
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "admin");
        map.put(2, "jack");
        map.put(3, "alice");
        // 将Map中的所有key存放到Set集合中进行转换
        Stream<Integer> keyStream = map.keySet().stream();
        keyStream.forEach(System.out::println);
        // 将Map的key-value使用Entry的方式存放到Set集合中进行转换
        // 其数据格式为:key=value
        Stream<Map.Entry<Integer, String>> entryStream = map.entrySet().stream();
        entryStream.forEach(System.out::println);
        System.out.println("--------------------------------");

        // 方式三:数组类型
        Integer[] arr = {1, 2, 3, 4, 5};
        // 通过Arrays工具类获取
        Stream<Integer> s1 = Arrays.stream(arr);
        s1.forEach(System.out::println);

        // 也可以通过Stream提供的静态方法进行获取
        String[] arr2 = {"南京", "北京", "武汉", "苏州", "杭州", "泰州", "常州"};
        Stream<String> s2 = Stream.of(arr2);
        s2.forEach(System.out::println);

        System.out.println("--------------------------------");

        // 方式四:可变长类型
        Stream<String> s3 = Stream.of("李白", "程咬金", "米莱狄", "虞姬", "项羽");
        s3.forEach(System.out::println);
        System.out.println("--------------------------------");

        // 方式五:无限流,将无限个元素添加到Stream中,永不停止
        UnaryOperator<Integer> operator = UnaryOperator.identity();
        // 参数一:初始元素
        // 参数二:直接使用UnaryOperator对象,表示每一次都是同一个值
        // Stream<Integer> s4 = Stream.iterate(1, operator);
        // s4.forEach(System.out::println);

        // UnaryOperator是一个函数式接口,因此,我们可以使用Lambda表达式控制下一个元素的值
        // Lambda表达式中参数表示当前元素的值,返回值表示下一个元素的值
        Stream<Integer> s5 = Stream.iterate(1, i -> i + 1);
        s5.forEach(System.out::println);


    }
}
